package ljl.codetop;

public class _122_max_profit {

    /**
     * 操放弃了，不会做
     */
    static class have_a_try {
        // 可以多次买卖，这个就麻烦了
        // 我记着是个二维数组，第一维两个值，一个是买，一个是卖
        // 第二维的每个元素表示每天买或卖的收益；是不是把卖的收益加起来就行了？
        // fixme 看来我的记忆没什么意义 平时搞那么多算计 实际完全没有道理 yoo man what's up yoo
        public int maxProfit(int[] prices) {
            int[][] dp = new int[2][prices.length];
            dp[0][0] = -prices[0];

            int res = 0;
            for (int i : dp[1]) {
                res += i;
            }
            return res;
        }
    }

    /**
     * 这是贪心算法
     * 只能计算最大利润，不能记录实际交易情况
     */
    static class lufei {

        public int maxProfit(int[] prices) {
            int profit = 0;
            for (int i = 1; i < prices.length; i++) {
                if (prices[i] > prices[i - 1]) {
                    profit += prices[i] - prices[i - 1];
                }
            }
            return profit;
        }

    }

    static class off1 {
        // 状态是：最大值：持有/未持有
        public int maxProfit(int[] prices) {
            int n = prices.length;
            int[][] dp = new int[n][2];
            dp[0][0] = 0;
            dp[0][1] = -prices[0];
            for (int i = 1; i < n; ++i) {
                dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
                dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
            }
            return dp[n - 1][0];
        }
    }

    static class off2 {
        public int maxProfit(int[] prices) {
            int n = prices.length;
            int sold = 0, hold = -prices[0];
            for (int i = 1; i < n; ++i) {
                int oldSold = sold;
                sold = Math.max(sold, hold + prices[i]);
                hold = Math.max(hold, oldSold - prices[i]);
            }
            return sold;
        }
    }
}
